const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
+const KeybindingMode = {
+ NONE: 0, // block all keybindings
+ NORMAL: 1 << 0, // window mode
+ OVERVIEW: 1 << 1,
+ LOCK_SCREEN: 1 << 2,
+ UNLOCK_SCREEN: 1 << 3,
+ LOGIN_SCREEN: 1 << 4,
+ MESSAGE_TRAY: 1 << 5,
+ SYSTEM_MODAL: 1 << 6,
+ LOOKING_GLASS: 1 << 7
+};
+
let componentManager = null;
let panel = null;
let overview = null;
let shellMountOpDBusService = null;
let screenSaverDBus = null;
let modalCount = 0;
+let keybindingMode = KeybindingMode.NORMAL;
let modalActorFocusStack = [];
let uiGroup = null;
let magnifier = null;
* - options: Meta.ModalOptions flags to indicate that the pointer is
* already grabbed
*
+ * - keybindingMode: used to set the current Main.KeybindingMode to filter
+ * global keybindings; the default of NONE will filter
+ * out all keybindings
+ *
* Returns: true iff we successfully acquired a grab or already had one
*/
function pushModal(actor, params) {
params = Params.parse(params, { timestamp: global.get_current_time(),
- options: 0 });
+ options: 0,
+ keybindingMode: KeybindingMode.NONE });
if (modalCount == 0) {
if (!global.begin_modal(params.timestamp, params.options)) {
modalActorFocusStack.push({ actor: actor,
focus: curFocus,
destroyId: actorDestroyId,
- focusDestroyId: curFocusDestroyId });
+ focusDestroyId: curFocusDestroyId,
+ keybindingMode: keybindingMode });
+ keybindingMode = params.keybindingMode;
global.stage.set_key_focus(actor);
return true;
}
global.stage.set_key_focus(null);
global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
+ keybindingMode = KeybindingMode.NORMAL;
throw new Error('incorrect pop');
}
if (focusIndex == modalActorFocusStack.length - 1) {
if (record.focus)
record.focus.disconnect(record.focusDestroyId);
+ keybindingMode = record.keybindingMode;
global.stage.set_key_focus(record.focus);
} else {
let t = modalActorFocusStack[modalActorFocusStack.length - 1];
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
+ modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
}
}
modalActorFocusStack.splice(focusIndex, 1);
global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
Meta.enable_unredirect_for_screen(global.screen);
+ keybindingMode = KeybindingMode.NORMAL;
}
function createLookingGlass() {
params = Params.parse(params, { shellReactive: false,
styleClass: null,
parentActor: Main.uiGroup,
+ keybindingMode: Main.KeybindingMode.SYSTEM_MODAL,
shouldFadeIn: true });
this.state = State.CLOSED;
this._hasModal = false;
+ this._keybindingMode = params.keybindingMode;
this._shellReactive = params.shellReactive;
this._shouldFadeIn = params.shouldFadeIn;
pushModal: function (timestamp) {
if (this._hasModal)
return true;
- if (!Main.pushModal(this._group, { timestamp: timestamp }))
+ if (!Main.pushModal(this._group, { timestamp: timestamp,
+ keybindingMode: this._keybindingMode }))
return false;
this._hasModal = true;